﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using Tibet.Entidades;
using Tibet.Logica.FabricaLogica;
using Tibet.Logica.Interfaces.MotorRegla;


namespace Tibet.Logica.Comandos.ComandoMotorRegla
{
    public class ConsultarEspacioOperadoresConEspacio : ConsultarEspacioOperadores, IConsultarEspacioOperadores
    {
        private bool SoloOperadores(string subcadena)
        //Regresa true si se encontraron solo operadores en la sub cadena y False si no. 
        {
            int i = 0;
            int ancho = subcadena.Length;
            char[] operadores = { '=', '!', '<', '>', '~', '+', '-', '*', '/', '%', '^', '<', '&', '|', '?' };
            int flagOperadores = 0;
            try
            {
                while (i < ancho)
                {
                    flagOperadores = 0;
                    foreach (char a in operadores)
                    {
                        if (subcadena[i] == a)
                        {
                            flagOperadores = 1;
                        }
                    }
                    if (flagOperadores == 0)
                        return false;
                    i++;
                }
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }
        
        private bool SoloNoOperadores(string subcadena)
        //Regresa true si se encontraron solo caracteres no operadores en la suba cadena y False si no. 
        {
            int i = 0;
            int ancho = subcadena.Length;
            char[] operadores = { '=', '!', '<', '>', '~', '+', '-', '*', '/', '%', '^', '<', '&', '|', '?' };
            int flagOperadores = 0;
            int flagAux = 0;
            try
            {
                while (i < ancho)
                {
                    foreach (char a in operadores)
                    {
                        if (subcadena[i] == a)
                        {
                            return false;
                        }
                    }
                    flagOperadores = flagAux;
                    i++;
                }
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }

        public override void Ejecutar()
        //Revisa si los operadores tienen espacio antes y despues.
        //Ejemplo: i = 1;  if(r <= 3)
        {
            int LineaActual = 0; //Linea actual que se esta leyendo.
            Resultado Resp = new Resultado(); //Objeto resultado que sera retornado.


            //Inicializamos Resp asumiendo que el archivo cumple con la regla.
            Resp.Fecha = new DateTime();
            Resp.Fecha = DateTime.Now;
            Resp.Respuesta = true;
            Resp.Mensaje = "No se encontraron errores";
            Resp.Linea = 0;

            try
            {
                List<EntidadString> listaStr = new List<EntidadString>();

                for (int j = 0; j < ListaEntidad.Count; j++)
                {
                    listaStr.Add((EntidadString)ListaEntidad.ElementAt(j));
                }


                foreach (EntidadString linea in listaStr)   //Recorro la lista linea por linea
                {
                    LineaActual++;
                    string[] subCadenas = linea.Linea.Split(' '); //Separamos la linea por espacios.
                    foreach (string sc in subCadenas)       //Por cada sub cadena  
                    {
                        if (SoloNoOperadores(sc) == false) //Si la subcadena contiene operadores
                        {
                            if (SoloOperadores(sc) == false)   //Checkeamos que la cadena contenga operadores y letras.
                            {
                                Resp.Linea = LineaActual;
                                Resp.Respuesta = false;
                                Resp.Mensaje = "Se olvido separar un operador en la linea " + LineaActual;
                                Entidad = (Resp as Entidad);
                            }
                        }
                    }// end foreach(subcadena en linea)

                } // foreach(linea in archivo)
                Entidad = (Resp as Entidad); //Retornamos Respuesta
            }// End Tr
            catch (Exception e)
            {
                Resp.Linea = LineaActual;
                Resp.Respuesta = false;
                Resp.Mensaje = "Ocurrio un error inesperado al leer la linea " + LineaActual + ". Error " + e.Message;
                Entidad = (Resp as Entidad);
            }

        }
    }
}
